<?php

class WucArchivo extends TTemplateControl {
//<editor-fold defaultstate="collapsed" desc="Variables de Configuracion">
  //variables privadas
  const NOMBRE_WEB_USER_CONTROL = "wucArchivo";
  const NOMBRE_VARIABLE_PREFIJO_CONTROL_JS = "prefijoControlArchivo";
  const NOMBRE_ARCHIVO_JS = "wucArchivo.js";
  const MAXIMO_ARCHIVOS_SUBIR = 10;
  const MAXIMO_ARCHIVOS_SIN_SCROLL = 6;
  //Modo Presentacion
  const PRESENTACION_INGRESO = "Ingreso";
  const PRESENTACION_INGRESO_MAS_LECTURA = "IngresoMasLectura";
  const PRESENTACION_SOLO_LECTURA = "SoloLectura";
  //Modo Expandir
  const MODO_CONTRAIDO = "Contraido";
  const MODO_EXPANDIDO = "Expandido";
  //Tablas del procedimiento almacenado
  const ARRAY_TODOS_LOS_ARCHIVOS = 0;
  const ARRAY_SOLO_IMAGENES = 1;

//</editor-fold>

//<editor-fold defaultstate="collapsed" desc="Propiedades">
  public function getModoPresentacion() { return $this->getViewState("ModoPresentacion"); }
  public function setModoPresentacion($value) { $this->setViewState("ModoPresentacion", $value); }

  public function getModoExpandirContraer() { return $this->getViewState("ModoExpandirContraer"); }
  public function setModoExpandirContraer($value) { $this->setViewState("ModoExpandirContraer", $value); }

  public function getCssClassTablaDatos() { return $this->getViewState("CssClassTablaDatos"); }
  public function setCssClassTablaDatos($value) { $this->setViewState("CssClassTablaDatos", $value); }

  public function getTituloBloque() { return $this->getViewState("TituloBloque"); }
  public function setTituloBloque($value) { $this->setViewState("TituloBloque", $value); }

  public function getDescripcion() { return $this->getViewState("Descripcion"); }
  public function setDescripcion($value) { $this->setViewState("Descripcion", $value); }

  public function getMostrarTiraImagenes() { return $this->getViewState("MostrarTiraImagenes"); }
  public function setMostrarTiraImagenes($value) { $this->setViewState("MostrarTiraImagenes", $value); }

  public function getMostrarExpandirContraer() { return $this->getViewState("MostrarExpandirContraer"); }
  public function setMostrarExpandirContraer($value) { $this->setViewState("MostrarExpandirContraer", $value); }

  public function getMostrarMensajeError() { return $this->getViewState("MostrarMensajeError"); }
  public function setMostrarMensajeError($value) { $this->setViewState("MostrarMensajeError", $value); }

  public function getMaximoArchivosSinScroll() { return $this->getViewState("MaximoArchivosSinScroll"); }
  public function setMaximoArchivosSinScroll($value) { $this->setViewState("MaximoArchivosSinScroll", $value); }

  public function getPaddingTop() { return $this->getViewState("PaddingTop"); }
  public function setPaddingTop($value) { $this->setViewState("PaddingTop", $value); }

  public function getPaddingBottom() { return $this->getViewState("PaddingBottom"); }
  public function setPaddingBottom($value) { $this->setViewState("PaddingBottom", $value); }

  public function getMaximoTamanoArchivo() { return $this->getViewState("MaximoTamanoArchivo"); }
  public function setMaximoTamanoArchivo($value) { $this->setViewState("MaximoTamanoArchivo", $value); }

  public function getTipoMarco() { return $this->getViewState("TipoMarco"); }
  public function setTipoMarco($value) { $this->setViewState("TipoMarco", $value); }
//</editor-fold>

//<editor-fold defaultstate="collapsed" desc="Metodos Privados">
  /**
   * registra los javascript asociados
   * @author VSR, 24/04/2011
   */
  protected function registrarJavaScript() {
    $clientId = $this->pnlBloque->ClientID;
    $id = $this->pnlBloque->ID;
    $prefijoControl = str_replace($id, "", $clientId);
    $dataScript = "";
    $dataScriptExpandirContraer = "";
    $sb = new StringBuilder();
    $themeBaseUrl = $this->Page->Theme->BaseUrl;

    //escribe bloque js para registrar el prefijo del control
    if ($this->Visible) {
      if ($this->ModoPresentacion == self::PRESENTACION_INGRESO || $this->ModoPresentacion == self::PRESENTACION_INGRESO_MAS_LECTURA) {
        $dataScript .= self::NOMBRE_VARIABLE_PREFIJO_CONTROL_JS." = \"".$prefijoControl."\";";

        //inicializa la configuracion del control
        $sb->appendLine("jQuery(document).ready(function() {");
        $sb->appendLine("  jQuery('#".$this->pnlUploader->ClientID."').plupload({ ");
        $sb->appendLine("    runtimes : 'flash,silverlight,browserplus,html5,gears,html4',");
        $sb->appendLine("    url : 'index.php?page=Archivo.Upload',");
        $sb->appendLine("    max_file_size : '100mb',");
        $sb->appendLine("    max_file_count: 20,");
        $sb->appendLine("    chunk_size : '1mb',");
        $sb->appendLine("    unique_names : false,");
        $sb->appendLine("    multiple_queues : true,");
        $sb->appendLine("    rename: true,");
        $sb->appendLine("    sortable: true,");
        $sb->appendLine("    flash_swf_url : 'js/plupload/plupload.flash.swf',");
        $sb->appendLine("    silverlight_xap_url : 'js/plupload/plupload.silverlight.xap'");
        $sb->appendLine("  });");
        $sb->appendLine("  WA_MostrarUploader();");
        $sb->appendLine("});");

        //registra bloque javascript en la pantalla
        $this->Page->ClientScript->registerScriptFile($prefijoControl."scriptFile1", "js/plupload/plupload.js");
        $this->Page->ClientScript->registerScriptFile($prefijoControl."scriptFile2", "js/plupload/plupload.gears.js");
        $this->Page->ClientScript->registerScriptFile($prefijoControl."scriptFile3", "js/plupload/plupload.silverlight.js");
        $this->Page->ClientScript->registerScriptFile($prefijoControl."scriptFile4", "js/plupload/plupload.flash.js");
        $this->Page->ClientScript->registerScriptFile($prefijoControl."scriptFile5", "js/plupload/plupload.browserplus.js");
        $this->Page->ClientScript->registerScriptFile($prefijoControl."scriptFile6", "js/plupload/plupload.html4.js");
        $this->Page->ClientScript->registerScriptFile($prefijoControl."scriptFile7", "js/plupload/plupload.html5.js");
        $this->Page->ClientScript->registerScriptFile($prefijoControl."scriptFile8", "js/plupload/jquery.ui.plupload.js");
        $this->Page->ClientScript->registerScriptFile($prefijoControl."scriptFile9", "js/plupload/plupload.i18n.js");
        $this->Page->ClientScript->registerScriptFile($prefijoControl."scriptFile11", "js/".self::NOMBRE_ARCHIVO_JS);
        $this->Page->ClientScript->registerHeadScript($prefijoControl."script", $dataScript);
        $this->Page->ClientScript->registerEndScript($prefijoControl."inicializarControl", $sb->toString());
      }

      //registra script para inicializar el slideShow de la galeria de imagenes cuando se cargue la pagina
      if ($this->MostrarTiraImagenes == "true" && ($this->ModoPresentacion == self::PRESENTACION_INGRESO_MAS_LECTURA || $this->ModoPresentacion == self::PRESENTACION_SOLO_LECTURA) ) {
        $this->Page->ClientScript->registerScriptFile($prefijoControl."scriptFileCarrusel", "js/framework/jquery.carouFredSel.js");
      }

      $this->wucMarcoTop->MostrarExpandirContraer = $this->MostrarExpandirContraer;
      $this->wucMarcoTop->ModoExpandirContraer = $this->ModoExpandirContraer;
      $this->wucMarcoTop->NombreContenedorContraer = $this->holderFormulario->ClientID;
      $this->wucMarcoTop->Tipo = $this->TipoMarco;
      $this->wucMarcoBottom->Tipo = $this->TipoMarco;
    }
  }

  /**
   * inicializa valores de los controles
   * @author VSR, 24/04/2011
   */
  protected function inicializaControles() {
    $INDICE_COLUMNA_GRILLAARCHIVO_DESCRIPCION = 2;
    $INDICE_COLUMNA_GRILLAARCHIVO_ELIMINAR = 3;
    $paddingBloque = "";

    $this->holderBloqueError->Style = "display:none;";
    $this->wucMarcoTop->Titulo = $this->TituloBloque;
    $this->lblDescripcion->Text = $this->Descripcion;
    $this->pnlContenedorControles->Visible = ($this->ModoPresentacion == self::PRESENTACION_INGRESO || $this->ModoPresentacion == self::PRESENTACION_INGRESO_MAS_LECTURA) ? true : false;
    $this->pnlHolderGrillaArchivos->Style = "padding-bottom:15px;";
    $this->pnlContenedorDetalle->Visible = ($this->ModoPresentacion == self::PRESENTACION_SOLO_LECTURA || $this->ModoPresentacion == self::PRESENTACION_INGRESO_MAS_LECTURA) ? true : false;
    $this->pnlGaleriaImagen->Visible = ($this->MostrarTiraImagenes == "true") ? true : false;
    $this->holderBloqueError->Visible = ($this->MostrarMensajeError == "true") ? true : false;

    //coloca el padding al control
    if(!Utilidades::isNullOrEmpty($this->PaddingTop)) { $paddingBloque .= "padding-top:".$this->PaddingTop; }
    if(!Utilidades::isNullOrEmpty($this->PaddingBottom)) { $paddingBloque .= "padding-bottom:".$this->PaddingBottom; }
    if(!Utilidades::isNullOrEmpty($paddingBloque)) { $this->pnlBloque->Style = $paddingBloque; }

    //dependiendo del modo de presentacion es lo que muestra
    if($this->ModoPresentacion == "SoloLectura") {
      //oculta columna abogado asociado
      Utilidades::visibleColumnaGrillaPorIndiceColumna($this->dgArchivos, $INDICE_COLUMNA_GRILLAARCHIVO_DESCRIPCION, false);
      Utilidades::visibleColumnaGrillaPorIndiceColumna($this->dgArchivos, $INDICE_COLUMNA_GRILLAARCHIVO_ELIMINAR, false);
    }
  }

  /**
   * obtiene los registros desde la base de datos
   * @param <type> $idRegistro
   * @param <type> $entidad
   * @author VSR, 25/04/2011
   */
  private function obtenerDatos($idRegistro, $entidad) {
    try {
      $arr = Archivo::obtenerListado($idRegistro, $entidad);
      if(!is_null($arr)) {
        if (count($arr[self::ARRAY_TODOS_LOS_ARCHIVOS]) == 0) { $arr = null; }
      }
    } catch (Exception $e) {
      $arr = null;
    }
    Utilidades::grabarSessionPorNombre(self::NOMBRE_WEB_USER_CONTROL, $arr);
  }

  /**
   * actualiza los archivos
   * @return string
   * @author VSR, 27/04/2011
   */
  private function actualizaArchivos($idRegistro, $entidad) {
    $msgError = "";
    try {
      foreach($this->dgArchivos->Items as $item) {
        if($item->ItemType==='Item' || $item->ItemType==='AlternatingItem') {
          //obtiene controles
          $txtIdArchivo = $item->findControl("txtIdArchivo");
          $txtIdArchivoRegistro = $item->findControl("txtIdArchivoRegistro");
          $txtDescripcion = $item->findControl("txtDescripcion");
          $chkEliminar = $item->findControl("chkEliminar");

          //verfica si tiene que eliminar el registro, sino actualiza la descripcion
          if ($chkEliminar->Checked) {
            $idArchivo = $txtIdArchivo->Value;
            $status = Archivo::eliminarArchivoEnBDPorId($txtIdArchivo->Value);
            if($status > 0){
              $directorioArchivoRepositorio = Archivo::RUTA_REPOSITORIO."/".$entidad."/reg".$idRegistro."/".$idArchivo;
              //elimina el archivo temporal del repositorio
              Archivo::eliminarDirectorio($directorioArchivoRepositorio);
            }
          } else {
            $status = Archivo::actualizarDescripcion($txtIdArchivoRegistro->Value, $txtDescripcion->Text);
          }
          //si hay un error entonces termina la funcion
          if ($status == Sistema::CODIGO_SQL_ERROR) {
            $msgError = "No se pudo actualizar los archivos.<br />";
            break;
          }
        }
      }
    } catch (Exception $e) {
      $msgError = "No se pudo actualizar los archivos.<br />";
    }
    return $msgError;
  }

  /**
   * dibuja la tira de imagenes
   * @param <type> $arr
   * @author VSR, 30/04/2011
   */
  private function crearGaleriaImagenes($arr) {
    $totalRegistros = 0;
    $queryString = "";
    $templateImagen = "<img src=\"{#RUTA_IMAGEN}\" alt=\"{#DESCRIPCION}\" title=\"{#DESCRIPCION}\" class=\"carrusel_dimension_imagen cursorPointer\" onclick=\"WA_VerImagenPopUp('{#QUERYSTRING}')\">";
    $sb = new StringBuilder();

    try {
      if(is_null($arr)) {
        $this->pnlGaleriaImagen->Style = "display:none";
        $this->pnlImagenes->Text = "";
      } else {
        $arrImagenes = $arr[self::ARRAY_SOLO_IMAGENES];
        $totalRegistros = count($arrImagenes);
        if ($totalRegistros == 0) {
          $this->pnlGaleriaImagen->Style = "display:none";
          $this->pnlImagenes->Text = "";
        } else {
          for ($i=0; $i <= $totalRegistros-1; $i++) {
            $row = $arrImagenes[$i];
            $idRegistro = $row["IdRegistro"];
            $entidad = $row["Entidad"];
            $idArchivo = $row["IdArchivo"];
            $nombreArchivo = $row["NombreArchivo"];
            $contentType = $row["ContentType"];
            $descripcion = $row["Descripcion"];
            $templateImagenAux = $templateImagen;
            $descripcion = (Utilidades::isNullOrEmpty($descripcion)) ? $nombreArchivo : $descripcion;

            //encripta el id
            $queryString = "{";
            $queryString .= " \"IdRegistro\":\"".$idRegistro."\"";
            $queryString .= ",\"Entidad\":\"".$entidad."\"";
            $queryString .= ",\"IdArchivo\":\"".$idArchivo."\"";
            $queryString .= ",\"NombreArchivo\":\"".$nombreArchivo."\"";
            $queryString .= ",\"ContentType\":\"".$contentType."\"";
            $queryString .= ",\"Descargable\":\"0\"";
            $queryString .= "}";
            $queryString = Criptografia::encriptarURL($queryString);

            //asigna valores
            //$rutaImagen = "index.php?page=Archivo.Visualizador&a=".$queryString;

            //construye ruta del archivo en el repositorio
            $rutaImagen = Archivo::RUTA_REPOSITORIO."/$entidad/reg$idRegistro/$idArchivo/$nombreArchivo";

            //reemplaza marcas especiales
            $templateImagenAux = str_replace("{#RUTA_IMAGEN}", $rutaImagen, $templateImagenAux);
            $templateImagenAux = str_replace("{#DESCRIPCION}", $descripcion, $templateImagenAux);
            $templateImagenAux = str_replace("{#QUERYSTRING}", $queryString, $templateImagenAux);
            $sb->appendLine($templateImagenAux);
          }
          $this->pnlGaleriaImagen->Style = "display:block";
          $this->pnlImagenes->Text = $sb->toString();

          //inicializa la configuracion del control
          $sb->clear();
          $sb->appendLine("jQuery(document).ready(function() {");
          $sb->appendLine("  jQuery('#".$this->pnlImagenes->ClientID."').carouFredSel({");
          $sb->appendLine("    auto : false,");
          $sb->appendLine("    prev : { button: '#".$this->lnkCarruselPrev->ClientID."', key: 'left' },");
          $sb->appendLine("    next : { button: '#".$this->lnkCarruselNext->ClientID."', key: 'right' }");
          $sb->appendLine("  });");
          $sb->appendLine("});");
          $this->Page->ClientScript->registerEndScript(self::NOMBRE_WEB_USER_CONTROL."inicializarCarrusel", $sb->toString());
        }
      }
    } catch (Exception $e) {
      $this->pnlGaleriaImagen->Style = "display:none";
      $this->pnlImagenes->Text = "";
    }

  }

//</editor-fold>

//<editor-fold defaultstate="collapsed" desc="Metodos Publicos">
  /**
   * dibuja tabla HTML con los datos encontrados
   * @param <type> $idRegistro
   * @param <type> $entidad
   * @param <type> $grabarDatosEnSesion
   * @author VSR, 25/04/2011
   */
  public function cargarDatos($idRegistro, $entidad, $grabarDatosEnSesion = true) {
    $maxArchivosSinScroll = (Utilidades::isNullOrEmpty($this->MaximoArchivosSinScroll)) ? self::MAXIMO_ARCHIVOS_SIN_SCROLL : $this->MaximoArchivosSinScroll;
    $altoDivConScrool = ($maxArchivosSinScroll * 25) + 40;
    $styleDivScroll = "";

    try {
      $this->obtenerDatos($idRegistro, $entidad);
      $arr = Utilidades::obtenerSessionPorNombre(self::NOMBRE_WEB_USER_CONTROL);
      if (!$grabarDatosEnSesion) { Utilidades::grabarSessionPorNombre(self::NOMBRE_WEB_USER_CONTROL, null); }

      if (is_null($arr)) {
        $totalRegistros = 0;
      } else {
        $arrArchivos = $arr[self::ARRAY_TODOS_LOS_ARCHIVOS];
        $totalRegistros = count($arrArchivos);
      }
      $this->txtTotalRegistros->Value = $totalRegistros;

      //si no hay registros entonces no dibuja nada
      if ($totalRegistros == 0) {
        $this->pnlHolderGrillaArchivos->Visible = false;
      } else {
        $this->pnlHolderGrillaArchivos->Visible = true;
        $this->dgArchivos->DataSource = $arrArchivos;
        $this->dgArchivos->dataBind();
        Utilidades::mostrarTotalRegistrosGrilla($totalRegistros, $this->lblTotalRegistrosArchivos, "Archivos");
        //si hay mas de 10 registros, entonces coloca un scroll en el panel de la grilla
        $this->divScroll->Style = "";

        if ($totalRegistros > $maxArchivosSinScroll) {
          $styleDivScroll .= "border:solid 1px #ccc;";
          $styleDivScroll .= "height:".$altoDivConScrool."px;";
          $styleDivScroll .= "overflow:scroll;";
          $styleDivScroll .= "overflow-X:hidden;";
          $styleDivScroll .= "position:relative;";
          $this->divScroll->Style = $styleDivScroll;
        }
      }

      //construye las imagenes para la galeria de imagenes
      if ($this->MostrarTiraImagenes == "true") {
        $this->crearGaleriaImagenes($arr);
      }
    } catch (Exception $e) {
      $this->pnlHolderGrillaArchivos->Visible = false;
    }
  }

  /**
   * graba los archivos en base datos
   * @param <type> $idRegistro
   * @param <type> $entidad
   * @return string
   */
  public function grabar($idRegistro, $entidad) {
    $msgError = "";
    try {
      //actualiza la descripcion de los archivos, o si se marcaron como eliminados
      $msgError .= $this->actualizaArchivos($idRegistro, $entidad);

      //graba los archivos subidos
      $arrArchivos = Utilidades::obtenerSessionPorNombre(Archivo::SESION_UPLOAD);
      //si hay archivos en session entonces se asocian en base de datos al registro que corresponde
      if(!is_null($arrArchivos)) {
        $totalRegistros = count($arrArchivos);
        for($i = 0; $i <= $totalRegistros - 1; $i++) {
          $idArchivo = $arrArchivos[$i]["IdArchivo"];
          $nombreArchivo = $arrArchivos[$i]["Nombre"];
          $tamano = $arrArchivos[$i]["Tamano"];
          $completado = $arrArchivos[$i]["Completado"];
          //graba solamente los que se subieron bien al repositorio
          if($completado == "1") {
            $status = Archivo::asociarArchivoConRegistro($idArchivo, $idRegistro, $entidad, $tamano);
            //mueve el archivo al directorio respectivo
            $directorioArchivoTemporal = Archivo::RUTA_REPOSITORIO."/".$idArchivo;
            $directorioArchivoDestino = Archivo::RUTA_REPOSITORIO."/".$entidad."/reg".$idRegistro."/".$idArchivo;
            if(!Archivo::existeDirectorio($directorioArchivoDestino)) {
              Archivo::crearDirectorio($directorioArchivoDestino);
            }
            //copia el archivo al directorio destino
            copy($directorioArchivoTemporal."/".$nombreArchivo, $directorioArchivoDestino."/".$nombreArchivo);
            //elimina el archivo temporal del repositorio
            Archivo::eliminarDirectorio($directorioArchivoTemporal);
          }
        }
        Utilidades::grabarSessionPorNombre(Archivo::SESION_UPLOAD, null);
      }

    } catch (Exception $e) {
      $msgError = "No se pudo grabar los archivos</br>";
    }
    return $msgError;
  }
//</editor-fold>

//<editor-fold defaultstate="collapsed" desc="Eventos Controles">
  public function onLoad($param) {
    parent::onLoad($param);
    //registra los bloques javascript respectivos
    $this->registrarJavaScript();
    $this->inicializaControles();
  }

  public function onDataBoundDataGrid($sender, $param){
    $paginaActual = Utilidades::obtenerNombrePaginaActual($this);
    $indicePrimeraFila = Utilidades::obtenerIndicePrimeraFilaGrilla($this->dgArchivos);
    $queryString = "";
    $item = $param->Item;
    $themeBaseUrl = $this->Page->Theme->BaseUrl;

    if($item->ItemType==='Item' || $item->ItemType==='AlternatingItem') {
      $txtNombreArchivo = $item->findControl("txtNombreArchivo");
      $txtTipoArchivo = $item->findControl("txtTipoArchivo");
      $txtContentType = $item->findControl("txtContentType");
      $txtTamano = $item->findControl("txtTamano");
      $txtIdArchivo = $item->findControl("txtIdArchivo");
      $txtIdRegistro = $item->findControl("txtIdRegistro");
      $txtEntidad = $item->findControl("txtEntidad");
      $lblNombreArchivo = $item->findControl("lblNombreArchivo");
      $chkEliminar = $item->findControl("chkEliminar");

      //encripta el id
      $queryString = "{";
      $queryString .= " \"IdRegistro\":\"".$txtIdRegistro->Value."\"";
      $queryString .= ",\"Entidad\":\"".$txtEntidad->Value."\"";
      $queryString .= ",\"IdArchivo\":\"".$txtIdArchivo->Value."\"";
      $queryString .= ",\"NombreArchivo\":\"".$txtNombreArchivo->Value."\"";
      $queryString .= ",\"ContentType\":\"".$txtContentType->Value."\"";
      $queryString .= ",\"Descargable\":\"1\"";
      $queryString .= "}";
      $queryString = Criptografia::encriptarURL($queryString);

      //asigna valores
      $icono = Utilidades::obtenerRutaIconoTipoArchivo($txtTipoArchivo->Value, $txtContentType->Value, $themeBaseUrl);
      $lblNombreArchivo->Text = $icono."&nbsp;&nbsp;<a href=\"index.php?page=Archivo.Visualizador&a=".$queryString."\">".$txtNombreArchivo->Value."&nbsp;&nbsp;(".Utilidades::convertirUnidadMedidaArchivo($txtTamano->Value, true).")</a>";
      $chkEliminar->Attributes->Add("onclick", "destacarFilaTabla('".$this->dgArchivos->ClientID."',this,'".Utilidades::COLOR_FONDO_FILA_NORMAL_GRIS_DATAGRID."','".Utilidades::COLOR_FONDO_FILA_DESTACADO_AMARILLO_DATAGRID."',false)");

      //limpia controles
      $txtNombreArchivo->Value = "";
      $txtTipoArchivo->Value = "";
      $txtContentType->Value = "";
      $txtTamano->Value = "";
      $txtIdRegistro->Value = "";
      $txtEntidad->Value = "";

      //asigna indice de la fila
      $indiceFila = $indicePrimeraFila + $item->ItemIndex;
      //asigna valor del indice de la fila al control
      Utilidades::setControlIndiceFila($item, "lblIndiceFila", $indiceFila);
    }
  }
//</editor-fold>
}

?>
